/**
 * @file writer.c
 * @author Marco Luisi
 *  Created on: 25 May 2010
 *      Author: Marco Luisi
 */

#include <errno.h>
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <assert.h>

#include "server_util.h"

FILE *logfile;//locale a start o qui?

//si potrebbe fare in modo che la mutex del writer
//valga anche per i messaggi e si locka solo quella?

//gli si linka il msg buffer?
//o direttamente la stringa come la riceve il client?
//nel caso si fa una funz format che parsa il msg crea la stringa
//la passa alla scrittura che scrive poi cancella

//si passa una copia dei messaggi?
//o un riferimento
//cosi spetta al writer fare la free



msg_queue writer_queue;

extern pthread_cond_t empty_cond;
extern pthread_cond_t full_cond;
extern pthread_mutex_t queue_mtx;
extern int pending_signal;

void* writer_start(void* f){
	char* filename;
	queue_node *n;
	queue_node *tmp;

	filename = (char*)f;

	/*Inizializzazione della coda*/
	writer_queue.mtx = &queue_mtx;
	writer_queue.e = &empty_cond;
	writer_queue.f = &full_cond;
	logfile = fopen(filename,"a");
	/*Loop principale*/
	while(pending_signal == 0){
		pthread_mutex_lock(&queue_mtx);
		while(writer_queue.head == NULL && pending_signal == 0){ //&& pending_signal == 0
			pthread_cond_wait(&empty_cond,&queue_mtx);
			printf("writer aspetta DOPO di cond %d!\n",pending_signal);
		}
		//printf("writer ripartito SIGNAL %d!\n",pending_signal);

		/*Scrittura dei messaggi in coda*/
		n = writer_queue.head;
		while(n != NULL){
			fprintf(logfile,"%s\n",n->text);
			fflush(logfile);
			printf("writer ha scritto %s",n->text);
//			printf("writer prima di free n->text!\n");
			free(n->text);
			tmp = n;
//			if(n->next == NULL){
//				//printf("writer n next NULL!\n");
//			}
			n = n->next;
			free(tmp);
			tmp = NULL;
		}
		//forse free dell'ultimo nodo rimasto?
		//printf("writer fuori da ciclo coda\n");
		writer_queue.head = NULL;
		pthread_mutex_unlock(&queue_mtx);
	}
	printf("writer in chiusura\n");
	/*Chiusura del file di log e del writer*/
	fclose(logfile);
	pthread_exit(NULL);
}


